/**
 * @file Ajax 辅助函数
 * @description 提供简化 API 调用和数据提取的辅助函数
 * @author Fieldano Team
 * @创建时间 2025-10-31
 */

import type { AxiosResponse } from 'axios'
import type { ApiResponse } from './ajax'

/**
 * 提取 API 响应中的实际数据
 * @description 从 AxiosResponse<ApiResponse<T>> 中提取 data.data
 * @template T 实际数据类型
 * @param promise Ajax 请求 Promise
 * @returns 实际数据
 *
 * @example
 * ```typescript
 * // 不使用 extractData
 * const response = await ajax.get<User[]>('/api/users')
 * const users = response.data.data // 需要访问 data.data
 *
 * // 使用 extractData
 * const users = await extractData(ajax.get<User[]>('/api/users'))
 * // users 直接是 User[] 类型
 * ```
 */
export async function extractData<T>(promise: Promise<AxiosResponse<ApiResponse<T>>>): Promise<T> {
  const response = await promise
  return response.data.data
}

/**
 * 提取完整的 API 响应（包含 code, message, data）
 * @description 从 AxiosResponse<ApiResponse<T>> 中提取 data
 * @template T 实际数据类型
 * @param promise Ajax 请求 Promise
 * @returns API 响应对象
 *
 * @example
 * ```typescript
 * const apiResponse = await extractResponse(ajax.get<User[]>('/api/users'))
 * console.log(apiResponse.code)    // 200
 * console.log(apiResponse.message) // "success"
 * console.log(apiResponse.data)    // User[]
 * ```
 */
export async function extractResponse<T>(
  promise: Promise<AxiosResponse<ApiResponse<T>>>
): Promise<ApiResponse<T>> {
  const response = await promise
  return response.data
}

/**
 * 提取 Axios 响应对象
 * @description 直接返回 AxiosResponse，用于需要访问响应头等信息的场景
 * @template T 实际数据类型
 * @param promise Ajax 请求 Promise
 * @returns Axios 响应对象
 *
 * @example
 * ```typescript
 * const axiosResponse = await extractAxiosResponse(ajax.get<User[]>('/api/users'))
 * console.log(axiosResponse.status)  // 200
 * console.log(axiosResponse.headers) // 响应头
 * console.log(axiosResponse.data)    // ApiResponse<User[]>
 * ```
 */
export async function extractAxiosResponse<T>(
  promise: Promise<AxiosResponse<ApiResponse<T>>>
): Promise<AxiosResponse<ApiResponse<T>>> {
  return promise
}

/**
 * 安全提取数据（带错误处理）
 * @description 提取数据，如果失败返回默认值
 * @template T 实际数据类型
 * @param promise Ajax 请求 Promise
 * @param defaultValue 失败时的默认值
 * @returns 实际数据或默认值
 *
 * @example
 * ```typescript
 * const users = await safeExtractData(ajax.get<User[]>('/api/users'), [])
 * // 如果请求失败，users 为 []
 * ```
 */
export async function safeExtractData<T>(
  promise: Promise<AxiosResponse<ApiResponse<T>>>,
  defaultValue: T
): Promise<T> {
  try {
    const response = await promise
    return response.data.data
  } catch (error) {
    console.error('[Ajax Helper] 提取数据失败:', error)
    return defaultValue
  }
}

/**
 * 批量提取数据
 * @description 并行执行多个请求并提取数据
 * @template T 实际数据类型数组
 * @param promises Ajax 请求 Promise 数组
 * @returns 实际数据数组
 *
 * @example
 * ```typescript
 * const [users, posts, comments] = await batchExtractData([
 *   ajax.get<User[]>('/api/users'),
 *   ajax.get<Post[]>('/api/posts'),
 *   ajax.get<Comment[]>('/api/comments')
 * ])
 * ```
 */
export async function batchExtractData<T extends any[]>(promises: {
  [K in keyof T]: Promise<AxiosResponse<ApiResponse<T[K]>>>
}): Promise<T> {
  const responses = await Promise.all(promises)
  return responses.map(response => response.data.data) as T
}

/**
 * 提取分页数据
 * @description 提取分页响应数据
 * @template T 列表项类型
 * @param promise Ajax 请求 Promise
 * @returns 分页数据
 *
 * @example
 * ```typescript
 * interface PaginatedUsers {
 *   items: User[]
 *   total: number
 *   page: number
 *   pageSize: number
 * }
 *
 * const paginatedData = await extractPaginatedData(
 *   ajax.get<PaginatedUsers>('/api/users?page=1')
 * )
 * console.log(paginatedData.items)  // User[]
 * console.log(paginatedData.total)  // 总数
 * ```
 */
export async function extractPaginatedData<T>(
  promise: Promise<AxiosResponse<ApiResponse<T>>>
): Promise<T> {
  return extractData(promise)
}
